﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Castle.ActiveRecord;

namespace Matriculex.Dominio
{
    [ActiveRecord("curso_aberto"), Serializable]
    public class CursoAberto : Curso
    {
        // construtor vazio necessário para o ActiveRecord
        protected CursoAberto() { }

        public CursoAberto(string nome, string código, int NumeroCiclos)
            : base(nome, código, NumeroCiclos)
        { 
            this.Disciplinas = new List<Disciplina>();
            this.Alunos = new List<AlunoAberto>();
        }

        [JoinedKey]
        public override int Id { get { return base.Id; } }
        [HasAndBelongsToMany(Table="curso_disciplina", ColumnRef="disciplina_id", ColumnKey="curso_id")]
        public IList<Disciplina> Disciplinas { get; set; }



        public IList<Disciplina> DisciplinasAtivas
        {
            get
            {
                var disciplina = from d in Disciplinas
                                 where d.Ativado == true
                                 select d;

                return disciplina.ToList();

            }

        }



        private IList<AlunoAberto> alunos;
        [HasMany(Inverse=true)]
        public IList<AlunoAberto> Alunos
        {
            get
            {
                return new List<AlunoAberto>(alunos).AsReadOnly();
            }
            private set { alunos = value; }
        }

        public override IList<Aluno> GetAlunos()
        {
            IList<Aluno> list = new List<Aluno>();
            foreach (AlunoAberto item in Alunos)
            {
                list.Add(item);
            }
            return list;
        }

        # region Métodos estáticos do ActiveRecord
        public static new void DeleteAll()
        {
            DeleteAll(typeof(CursoAberto));
        }

        public static new CursoAberto[] FindAll()
        {
            return (CursoAberto[])FindAllByProperty(typeof(CursoAberto),"Ativado", true);
        }

        public static CursoAberto Find(int id)
        {
            return (CursoAberto)FindByPrimaryKey(typeof(CursoAberto), id);
        }
        #endregion
    }
}
